package com.tdam2013.grupo12.clasesDeNegocio;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;

public class BaseDeDatos extends SQLiteOpenHelper {
	// Nombre de la base de datos
	static final String dbName = "contactosDB";
	// Tabla accion
	static final String AccionTabla = "Accion";
	static final String colAccionID = "AccionID";
	static final String colAccionNombre = "NombreAccion";
	static final String colAccionFechaYHora = "Fecha";
	static final String colAccionContactoNombre = "ContactoNombre";
	static final String colAccionContactoId = "ContactoID";
	static final String colAccionDescripcion = "Descripcion";
	// Tabla usuario web(mio)
	static final String usuarioWebTabla = "UsuarioWeb";
	static final String colUsuarioWebID = "UsuarioWebID";
	static final String colUsuarioWebNombre = "UsuarioWebNombre";
	static final String colUsuarioWebPassword = "UsuarioWebPassword";
	// Tabla usuarios de los contactos
	static final String contactoUsuarioTabla = "ContactoUsuarioWeb";
	static final String colContactoUsuarioID = "ContactoUsuarioID";
	static final String colContactoUsuarioNombre = "ContactoUsuarioNombre";
	static final String colContactoUsuarioIdContacto = "ContactoUsuarioIdUsuario";
	// Tabla conectividad
	static final String conectividadTabla = "Conectividad";
	static final String colConectividadID = "ConectividadID";
	static final String colConectividadDescripcion = "Descripcion";
	static final String colConectividadFechaYHora = "FechaHora";
	// Tabla Mensaje
	static final String MensajeTabla = "Mensaje";
	static final String colMensajeID = "MensajeID";
	static final String colMensajeTipo = "MensajeTipo";
	static final String colMensajeContactoNombre = "MensajeContactoNombre";
	static final String colMensajeDescripcion = "MensajeDescripcion";
	static final String colMensajeFechaYHora = "MensajeFechaHora";
	static final String colMensajeVisto = "MensajeVisto";

	public BaseDeDatos(Context context) {
		super(context, dbName, null, 1);
	}

	@Override
	public void onCreate(SQLiteDatabase db) {
		String creacionTablaAcciones = "CREATE TABLE " + AccionTabla + "("
				+ colAccionID + " INTEGER PRIMARY KEY AUTOINCREMENT, "
				+ colAccionNombre + " TEXT , " + colAccionFechaYHora
				+ " LONG , " + colAccionContactoNombre + " TEXT, "
				+ colAccionContactoId + " INTEGER, " + colAccionDescripcion
				+ " TEXT)";
		db.execSQL(creacionTablaAcciones);

		String creacionTablaMiUsuarioWeb = "CREATE TABLE " + usuarioWebTabla
				+ "(" + colUsuarioWebID
				+ " INTEGER PRIMARY KEY AUTOINCREMENT, " + colUsuarioWebNombre
				+ " TEXT, " + colUsuarioWebPassword + " TEXT)";

		db.execSQL(creacionTablaMiUsuarioWeb);

		String creacionTablaUsuariosContactos = "CREATE TABLE "
				+ contactoUsuarioTabla + "(" + colContactoUsuarioID
				+ " INTEGER PRIMARY KEY AUTOINCREMENT, "
				+ colContactoUsuarioNombre + " TEXT, "
				+ colContactoUsuarioIdContacto + " INTEGER)";
		db.execSQL(creacionTablaUsuariosContactos);

		String creacionTablaConectividad = "CREATE TABLE " + conectividadTabla
				+ "(" + colConectividadID
				+ " INTEGER PRIMARY KEY AUTOINCREMENT, "
				+ colConectividadDescripcion + " TEXT, "
				+ colConectividadFechaYHora + " LONG)";
		db.execSQL(creacionTablaConectividad);

		String creacionTablaMensaje = "CREATE TABLE " + MensajeTabla + "("
				+ colMensajeID + " INTEGER PRIMARY KEY AUTOINCREMENT, "
				+ colMensajeContactoNombre + " TEXT, " + colMensajeDescripcion
				+ " TEXT, " + colMensajeFechaYHora + " LONG, " + colMensajeTipo
				+ " TEXT, " + colMensajeVisto + " INTEGER)";
		db.execSQL(creacionTablaMensaje);
	}

	@Override
	public void onUpgrade(SQLiteDatabase db, int arg1, int arg2) {
		db.execSQL("DROP TABLE IF EXISTS " + AccionTabla);
		db.execSQL("DROP TABLE IF EXISTS " + usuarioWebTabla);
		db.execSQL("DROP TABLE IF EXISTS " + contactoUsuarioTabla);
		db.execSQL("DROP TABLE IF EXISTS " + conectividadTabla);
		onCreate(db);
	}

	public boolean consultarExistsUsuarioWebMio() {
		boolean resultado;
		SQLiteDatabase db = this.getWritableDatabase();
		Cursor cursor;
		String consulta = "SELECT " + colUsuarioWebID + " as _id FROM "
				+ usuarioWebTabla;
		cursor = db.rawQuery(consulta, new String[] {});
		if (cursor.moveToNext())
			resultado = true;
		else
			resultado = false;
		cursor.close();
		db.close();
		return resultado;
	}

	public boolean consultarExistsUsuarioContacto(String id) {
		boolean resultado;
		SQLiteDatabase db = this.getWritableDatabase();
		Cursor cursor;
		String consulta = "SELECT " + colContactoUsuarioID + " as _id FROM "
				+ contactoUsuarioTabla + " WHERE "
				+ colContactoUsuarioIdContacto + " = ?";
		cursor = db.rawQuery(consulta, new String[] { id });
		if (cursor.moveToNext())
			resultado = true;
		else
			resultado = false;

		cursor.close();
		db.close();
		return resultado;
	}

	public ArrayList<Accion> getAllAcciones(Contacto c) {
		ArrayList<Accion> acciones = new ArrayList<Accion>(0);
		Accion a;
		SQLiteDatabase db = this.getWritableDatabase();
		String[] columns = new String[] { colAccionID + " as _id",
				colAccionNombre, colAccionContactoNombre, colAccionFechaYHora,
				colAccionContactoId, colAccionDescripcion };
		Cursor cursor = db.query(AccionTabla, columns, colAccionContactoId
				+ "= ?", new String[] { c.getId() + "" }, null, null, null);

		if (cursor.getCount() > 0) {
			while (cursor.moveToNext()) {
				a = new Accion();
				a.setId(cursor.getInt(cursor.getColumnIndex("_id")));
				a.setIdContacto(cursor.getInt(cursor
						.getColumnIndex(colAccionContactoId)));
				a.setNombreAccion(cursor.getString(cursor
						.getColumnIndex(colAccionNombre)));
				a.setNombreContacto(cursor.getString(cursor
						.getColumnIndex(colAccionContactoNombre)));
				Date d = new Date();
				d.setTime(cursor.getLong(cursor
						.getColumnIndex(colAccionFechaYHora)) * 1000);
				a.setFecha(d);

				acciones.add(a);
			}
		}
		cursor.close();
		db.close();
		return acciones;
	}

	public ArrayList<Accion> getAllAcciones(Contacto c,
		String preferenciaFiltro, String ordenFecha) {
		ArrayList<Accion> acciones = new ArrayList<Accion>(0);
		Accion a;
		Cursor cursor;
		SQLiteDatabase db = this.getWritableDatabase();
		String[] columns = new String[] { colAccionID + " as _id",
				colAccionNombre, colAccionContactoNombre, colAccionFechaYHora,
				colAccionContactoId, colAccionDescripcion };
		if (preferenciaFiltro.compareTo("Todos") == 0)
			cursor = db.query(AccionTabla, columns, colAccionContactoId
					+ " = ?", new String[] { c.getId() + "" }, null, null,
					colAccionFechaYHora + " " + ordenFecha);
		else
			cursor = db.query(AccionTabla, columns, colAccionContactoId
					+ " = ? AND " + colAccionNombre + " = ?",
					new String[] { c.getId() + "", preferenciaFiltro }, null,
					null, colAccionFechaYHora + " " + ordenFecha);
		if (cursor.getCount() > 0) {
			while (cursor.moveToNext()) {
				a = new Accion();
				a.setId(cursor.getInt(cursor.getColumnIndex("_id")));
				a.setIdContacto(cursor.getInt(cursor
						.getColumnIndex(colAccionContactoId)));
				a.setNombreAccion(cursor.getString(cursor
						.getColumnIndex(colAccionNombre)));
				a.setNombreContacto(cursor.getString(cursor
						.getColumnIndex(colAccionContactoNombre)));
				a.setDescripcion(cursor.getString(cursor
						.getColumnIndex(colAccionDescripcion)));
				Date d = new Date();
				d.setTime(cursor.getLong(cursor
						.getColumnIndex(colAccionFechaYHora)) * 1000);
				a.setFecha(d);
				acciones.add(a);
			}
		}
		cursor.close();
		db.close();
		return acciones;
	}

	public Usuario getUsuarioWebMio() {
		Usuario u = null;
		SQLiteDatabase db = this.getWritableDatabase();
		Cursor cursor;
		String consulta = "SELECT " + colUsuarioWebID + " as _id, "
				+ colUsuarioWebNombre + ", " + colUsuarioWebPassword + " FROM "
				+ usuarioWebTabla;
		cursor = db.rawQuery(consulta, new String[] {});
		if (cursor.moveToNext()) {
			String nombre = cursor.getString(cursor
					.getColumnIndex(colUsuarioWebNombre));
			String password = cursor.getString(cursor
					.getColumnIndex(colUsuarioWebPassword));
			int id = cursor.getInt(cursor.getColumnIndex("_id"));
			u = new Usuario(id, nombre, password);
		}
		cursor.close();
		db.close();
		return u;
	}

	public ArrayList<Mensaje> getMensajes(Contacto c) {
		ArrayList<Mensaje> mensajes = new ArrayList<Mensaje>(0);
		Mensaje m;
		Cursor cursor;
		SQLiteDatabase db = this.getWritableDatabase();
		String[] columns = new String[] { colMensajeID + " as _id",
				colMensajeContactoNombre, colMensajeDescripcion, colMensajeFechaYHora,
				colMensajeTipo, colMensajeVisto};
		cursor = db.query(MensajeTabla, columns, colMensajeContactoNombre
				+ " LIKE ?",
				new String[] { c.getUsuarioWeb() + ""}, null, null,
				colMensajeFechaYHora + " ASC");
		if (cursor.getCount() > 0) {
			while (cursor.moveToNext()) {
				m = new Mensaje();
				m.setId(cursor.getInt(cursor.getColumnIndex("_id")));
				m.setTipo(cursor.getString(cursor
						.getColumnIndex(colMensajeTipo)));
				m.setNombreContacto(cursor.getString(cursor
						.getColumnIndex(colMensajeContactoNombre)));
				m.setDescripcion(cursor.getString(cursor
						.getColumnIndex(colMensajeDescripcion)));
				Date d = new Date();
				d.setTime(cursor.getLong(cursor
						.getColumnIndex(colMensajeFechaYHora)) * 1000);
				m.setFechaYHora(d);
				m.setVisto(cursor.getInt(cursor
						.getColumnIndex(colMensajeVisto)));
				mensajes.add(m);
			}
		}
		cursor.close();
		db.close();
		return mensajes;
	}

	public boolean modificarNombreUsuario(Usuario u) {
		SQLiteDatabase db = this.getWritableDatabase();
		ContentValues cv = new ContentValues();
		cv.put(colUsuarioWebNombre, u.getNombreUsuario());
		cv.put(colUsuarioWebPassword, u.getPassword());
		if (db.update(usuarioWebTabla, cv, colUsuarioWebID + " = ?",
				new String[] { u.getIdUsuario() + "" }) == 1) {
			db.close();
			return true;
		} else {
			db.close();
			return false;
		}
	}

	public boolean registrarContactoUsuario(String nombreEscrito, String id) {

		SQLiteDatabase db = this.getWritableDatabase();
		ContentValues cv = new ContentValues();
		cv.put(colContactoUsuarioNombre, nombreEscrito);
		cv.put(colContactoUsuarioIdContacto, id);
		if (db.insert(contactoUsuarioTabla, null, cv) != -1) {
			db.close();
			return true;
		} else {
			db.close();
			return false;
		}
	}

	public boolean registrarUsuarioWebMio(Usuario u) {
		SQLiteDatabase db = this.getWritableDatabase();
		ContentValues cv = new ContentValues();
		cv.put(colUsuarioWebNombre, u.getNombreUsuario());
		cv.put(colUsuarioWebPassword, u.getPassword());
		if (db.insert(usuarioWebTabla, null, cv) != -1) {
			db.close();
			return true;
		} else {
			db.close();
			return false;
		}
	}

	public boolean registrarAccion(Accion accion) {
		SQLiteDatabase db = this.getWritableDatabase();
		ContentValues cv = new ContentValues();
		cv.put(colAccionNombre, accion.getNombreAccion());
		cv.put(colAccionFechaYHora, accion.getFecha().getTime() / 1000);
		if (accion.getNombreContacto() != null)
			cv.put(colAccionContactoNombre, accion.getNombreContacto());
		if (accion.getDescripcion() != null)
			cv.put(colAccionDescripcion, accion.getDescripcion());
		cv.put(colAccionContactoId, accion.getIdContacto());
		if (db.insert(AccionTabla, null, cv) != -1) {
			db.close();
			return true;
		} else {
			db.close();
			return false;
		}

	}

	public boolean registrarCambioConectividad(String descripcion, Long fecha) {
		SQLiteDatabase db = this.getWritableDatabase();
		ContentValues cv = new ContentValues();
		cv.put(colConectividadDescripcion, descripcion);
		cv.put(colConectividadFechaYHora, fecha / 1000);
		if (db.insert(conectividadTabla, null, cv) != -1) {
			db.close();
			return true;
		} else {
			db.close();
			return false;
		}
	}

	public void borrarAccion(int id) {
		SQLiteDatabase db = this.getWritableDatabase();
		db.delete(AccionTabla, colAccionID + " = ?", new String[] { id + "" });
		db.close();
	}

	public void guardarNuevosMensajesRecibidos(ArrayList<Mensaje> mensajes) {
		SQLiteDatabase db = this.getWritableDatabase();
		ContentValues cv = new ContentValues();
		for (int i = 0; i < mensajes.size(); i++) {
			cv.put(colMensajeTipo, mensajes.get(i).getTipo());
			cv.put(colMensajeVisto, mensajes.get(i).getVisto());
			cv.put(colMensajeFechaYHora, mensajes.get(i).getFechaYHora()
					.getTime() / 1000);
			cv.put(colMensajeContactoNombre, mensajes.get(i)
					.getNombreContacto());
			if (mensajes.get(i).getDescripcion() != null)
				cv.put(colMensajeDescripcion, mensajes.get(i).getDescripcion());
			db.insert(MensajeTabla, null, cv);
		}
		db.close();
	}

	public Date getFechaUltimaConsultaMensajes() {
		Date d = null;
		SQLiteDatabase db = this.getWritableDatabase();
		Cursor cursor;
		String consulta = "SELECT MAX (" + colMensajeFechaYHora + ") as "+colMensajeFechaYHora+" FROM "
				+ MensajeTabla;
		cursor = db.rawQuery(consulta, new String[] {});
		if (cursor.moveToNext()) {
			d = new Date();
			d.setTime(cursor.getLong(cursor
					.getColumnIndex(colMensajeFechaYHora)) * 1000);
		}
		cursor.close();
		db.close();
		return d;
	}

	public int getIdContacto(String nombreContacto) {
		int idContacto = 0;
		SQLiteDatabase db = this.getWritableDatabase();
		Cursor cursor;
		String consulta = "SELECT " + colContactoUsuarioID + " FROM "
				+ contactoUsuarioTabla + " WHERE " + colContactoUsuarioNombre
				+ " = ?";
		cursor = db.rawQuery(consulta, new String[] { nombreContacto });
		if (cursor.moveToNext()) {
			idContacto = cursor.getInt(cursor
					.getColumnIndex(colContactoUsuarioID));
		}
		cursor.close();
		db.close();
		return idContacto;
	}

	public boolean registrarMensaje(Mensaje m) {
		SQLiteDatabase db = this.getWritableDatabase();
		ContentValues cv = new ContentValues();
		cv.put(colMensajeContactoNombre, m.getNombreContacto());
		cv.put(colMensajeFechaYHora, m.getFechaYHora().getTime() / 1000);
		cv.put(colMensajeDescripcion, m.getDescripcion());
		cv.put(colMensajeTipo, m.getTipo());
		cv.put(colMensajeVisto, m.getVisto());
		if (db.insert(MensajeTabla, null, cv) != -1) {
			db.close();
			return true;
		} else {
			db.close();
			return false;
		}
	}

	public boolean tieneMensajesNuevos(String nombreContacto) {
		int idContacto = 0;
		boolean resultado;
		SQLiteDatabase db = this.getWritableDatabase();
		Cursor cursor;
		String consulta = "SELECT 1 FROM "
				+ MensajeTabla + " WHERE " + colMensajeContactoNombre + " LIKE ? AND "+colMensajeTipo+" LIKE 'Recibido' AND "+ colMensajeVisto + "=0";
		cursor = db.rawQuery(consulta, new String[] { nombreContacto });
		if (cursor.moveToNext()) {
			resultado = true;
		}else{
			resultado = false;
		}
		cursor.close();
		db.close();
		return resultado;
	}

	public String getNombreUsuarioContacto(String idContacto) {
		String nombreUsuario = "";
		SQLiteDatabase db = this.getWritableDatabase();
		Cursor cursor;
		String consulta = "SELECT " + colContactoUsuarioNombre + " FROM "
				+ contactoUsuarioTabla + " WHERE " + colContactoUsuarioIdContacto
				+ " = ?";
		cursor = db.rawQuery(consulta, new String[] { idContacto+"" });
		if (cursor.moveToNext()) {
			nombreUsuario = cursor.getString(cursor
					.getColumnIndex(colContactoUsuarioNombre));
		}
		cursor.close();
		db.close();
		return nombreUsuario;
	}

	public void setMensajesVistos(ArrayList<Mensaje> mensajes) {
		SQLiteDatabase db = this.getWritableDatabase();
		ContentValues cv = new ContentValues();
		for (int i = 0; i < mensajes.size(); i++) {
			cv.put(colMensajeVisto, 1);
			db.update(MensajeTabla, cv, colMensajeID + " = ?",
					new String[] { mensajes.get(i).getId() + "" });
		}
		db.close();
	}

	public void borrarMensaje(int id) {
		SQLiteDatabase db = this.getWritableDatabase();
		db.delete(MensajeTabla, colMensajeID + " = ?", new String[] { id + "" });
		db.close();
	}

	public ArrayList<Accion> getUltimasLlamadas() {
		ArrayList<Accion> acciones = new ArrayList<Accion>(0);
		Accion a;
		Cursor cursor;
		SQLiteDatabase db = this.getWritableDatabase();
		String[] columns = new String[] { colAccionID + " as _id",
				colAccionNombre, colAccionContactoNombre, colAccionFechaYHora,
				colAccionContactoId, colAccionDescripcion };
		cursor = db.query(AccionTabla, columns, colAccionNombre + " LIKE 'Llamada'",
					new String[] {}, null,
					null, colAccionFechaYHora + " DESC ");
		if (cursor.getCount() > 0) {
			while (cursor.moveToNext()) {
				a = new Accion();
				a.setId(cursor.getInt(cursor.getColumnIndex("_id")));
				a.setIdContacto(cursor.getInt(cursor
						.getColumnIndex(colAccionContactoId)));
				a.setNombreAccion(cursor.getString(cursor
						.getColumnIndex(colAccionNombre)));
				a.setNombreContacto(cursor.getString(cursor
						.getColumnIndex(colAccionContactoNombre)));
				a.setDescripcion(cursor.getString(cursor
						.getColumnIndex(colAccionDescripcion)));
				Date d = new Date();
				d.setTime(cursor.getLong(cursor
						.getColumnIndex(colAccionFechaYHora)) * 1000);
				a.setFecha(d);
				acciones.add(a);
			}
		}
		cursor.close();
		db.close();
		return acciones;
	}

}
